WEB3 Day2—BlockChain Basic 2 + Solidity基础[part1]

WEB3 Day2—BlockChain Basic 2 + Solidity基础[part1]

Layer1

​ blockChain的base layer,例如bitcoin、BNB chain、Solana,and Avalanche.

Layer2

构建在L1区块链外部但是也与之连接的任何应用application。有各种类型,比如for example ChainLink(去中心化预言机网络) ,以及像The Graph(事件索引网络)。

好的,我将为你优化这段区块链技术描述,提升专业性和清晰度:

Rollup 技术:以太坊Layer2扩容的核心方案

Rollup是Layer2(L2)扩容的主流解决方案,其核心原理是将多笔链下交易打包为一个聚合交易,仅将交易摘要(而非完整数据)提交至以太坊主链(Layer1),大幅提升交易吞吐量并降低Gas费用。根据验证机制不同,Rollup可分为两类:

1. Optimistic Rollups(乐观汇总)

  • 工作机制:默认所有链下交易均为有效,运营商(Operator)定期向主链提交状态根(State Root)和交易哈希。若其他参与者发现欺诈交易,可在挑战期(通常7天)内提交欺诈证明(Fraud Proof)进行质疑。
  • 安全性:依赖经济惩罚机制(押金锁定)和链上验证合约,若运营商被证明欺诈,将损失押金并回滚状态。
  • 代表项目:Arbitrum、Optimism、Base。

2. Zero-Knowledge Rollups(零知识汇总)

  • 工作机制:通过零知识证明(ZK Proof)技术生成有效性证明(Validity Proof),证明交易批次的合法性。验证者只需检查证明,无需重放所有交易。
  • 核心优势
    • 即时确定性:无需挑战期,交易确认后不可逆转。
    • 更高安全性:数学证明保证状态正确性,无需依赖信任假设。
    • 更低Gas成本:数据压缩率可达1000:1,验证成本显著低于Optimistic方案。
  • 代表项目:zkSync、StarkNet、Polygon zkEVM。

3. 见证(Witness)与零知识证明

  • 见证(Witness):是证明者(Prover)生成的一组中间值,用于证明输入数据满足特定数学关系(如哈希函数、椭圆曲线方程)。在ZK Rollups中,Witness包含交易数据、状态转换逻辑等信息,但不泄露具体内容。
  • 验证流程
    1. 证明者收集交易并生成状态转换。
    2. 基于Witness生成零知识证明(如SNARK或STARK)。
    3. 验证者(Verifier)通过智能合约检查证明,确认输出状态与预期一致。
  • 技术特性
    • 简洁性:证明大小通常仅几十KB,验证时间极短(毫秒级)。
    • 非交互性:单个证明可独立验证,无需与证明者交互。

对比与应用场景

特性 Optimistic Rollups ZK Rollups
验证机制 欺诈证明(默认有效,需挑战) 有效性证明(数学证明)
最终确认时间 7天挑战期后 几秒至几分钟(证明生成后)
兼容性 完全兼容EVM(支持所有Solidity合约) 部分兼容(需适配ZK-EVM)
适用场景 DeFi协议、复杂智能合约 NFT铸造、高频交易、隐私保护

Rollup技术通过链下计算+链上验证的模式,将以太坊的理论TPS从15提升至2000+,Gas成本降低90%以上。Optimistic方案侧重兼容性,ZK方案侧重安全性与效率,两者共同推动区块链应用进入规模化阶段。随着ZK-EVM(如zkSync 2.0)的成熟,未来大多数应用可能转向零知识Rollup架构。

RollUp stage (Rollup 发展阶段)

Stage 0

在这个初始的阶段,RollUp的治理主要由运营方和安全委员会掌控,确保关键决策并且有可信的团体去专门监督(中心化的),此阶段的用户拥有退出机制,可以在七天内离开rollup,但是通常需要实体和运营方的操作进行结合。

Stage 1

中心化的治理演化为智能合约管理,当然安全委员会同时发挥作用。

证明系统完全开始运作,支持去中心化的有效证明。

退出机制也得到改进,用户可独立退出而无需运营方协调。

Stage 2

通过完全由智能合约管理的治理机制实现完全去中心化

无需运营方和安全委员会干预。

证明系统是无许可的,退出机制也完全去中心化。

ZKSync Risk Analysis[风险分析]

https://l2beat.com/scaling/summary L2Beat摘要中可以查看各Rollup所处的stage

Risks那一列的饼图可以体现当前阶段的一些风险,例如ZkSync Era专属页面中:

image-20250617173334249
  • Data Availability: refers to the ability to reconstruct the L2 state from L1 data, ensuring that anyone can verify and rebuild the L2 state if necessary.

    能够从L1的数据中重建L2状态

  • State Validation: involves verifying the legitimacy of a set of bundled transactions. For ZK Sync, this is done using zero-knowledge proofs through an algorithm known as PLONK (Permutations over Lagrange-bases for Oecumenical Noninteractive arguments of Knowledge).

    涉及验证一组打包交易的合法性。

  • Sequencer Failure: describes the ability to process transactions even if the sequencer is down. In ZK Sync, transactions can still be submitted to L1, though not necessarily enforced immediately.

    排序器故障,描述了即使排序器宕机还能够处理交易的能力,这里黄色区块表示,在ZKsync中,交易仍然可以提交到L1,但不一定能够强制执行。

    排序器:是负责对打包的用户交易进行排序的操作方(运营商)

    The sequencer is the operator responsible for ordering user transactions and often batching them before committing them to Layer 1.

  • Proposer Failure: describes the ability to process transactions even if the proposer is down. In this case, ZK Sync will halt all withdrawals and transactions executions.

    提议者宕机但是可以处理交易的能力。在Zksync中回暂停所有的提款和交易执行。

  • Exit Window: In the current ZK Sync stage, there is no window for exit during unwanted upgrades.

    红色区块表示Zksync在非预期的升级时不存在退出窗口期。

First Transaction On ZKSync

chainList 官网搜索ZKsync sepolia

https://chainlist.org/?search=zksync+sepolia&testnets=true

image-20250617173444316

进行connect

image-20250617173504740 image-20250617173525324

zkSync官网的block explorer 中,可搜索到自己的账户,查看交易详情

如何获取测试网络的基金?

📒 NOTE

Network Fauncets

这里可以通过brige桥接源链和目标链来进行,也有两种方式,一种是lock和unlock 另一种是烧毁和铸造;

可能会有安全问题,但是基于ZkSync使用过程的经验来说,是比较安全的。

image-20250617173555637

了解原理之后,我们在推荐的fauncet里获取我们的fund

image-20250617173615481

这里我recive失败了,重新找了其他funsets ,可以用回tenderly试试看

Solidity 基础[part1]

Remix IDE

image-20250617173639681

函数

无返回体函数示例:

// SPDX-License-Identifier: MIT
pragma solidity 0.8.19; // chose our solidity version 

contract SimpleStorage {
    uint256 public myFavoriteNumber; // 初始值就是0 而且是internal 也就是内部不可见的

    function store(uint256 favoriteNumber) public {
        myFavoriteNumber = favoriteNumber;
    }

}

有返回体示例:

function recive() public view returns (uint256) {
       return myFavoriteNumber;
   }

数组

// 数组
uint256[] public myFavoriteNumbers;


Person public newPerson = Person(1, 'jack');

Person public myPerson;


function setPerson(string memory name, uint256 person_number) public {
    myPersonArray.push(Person(person_number,name));
}

结构

// 结构
    struct Person {
        uint256 personNumber;
        string name;
    }

数组加结构

// 数组加结构
 Person[] public myPersonArray;

可见性

函数和变量有四种可见性修饰符:

  • public:可从合约内部和外部合约访问
  • private:仅限当前合约内部访问。不会隐藏值,仅限制其访问权限。
  • external:仅适用于外部的合约访问。⚠️
  • internal: 当前合约和派生的合约可以访问。

如果没有指定,默认是internal

view 、pure

函数操作权限修饰符

1. view 关键字

  • 功能:使用view关键字修饰的函数,承诺不会对区块链的状态进行修改。

  • 可执行操作

    • 能够读取区块链上的数据(也就是状态变量)。
    • 可以访问 msg.sender、block.number 等全局变量。
    • 支持调用其他同样被标记为view或者pure的函数。
  • 不可执行操作:禁止对状态变量进行写入操作。

  • 示例

contract ViewExample {
    uint public balance;

    // 此函数仅读取状态变量,不会对其进行修改
    function getBalance() public view returns (uint) {
        return balance;
    }
}

2. pure 关键字

  • 功能:被pure关键字修饰的函数,既不会读取也不会修改区块链的状态。

  • 可执行操作

    • 可以使用函数内部定义的局部变量。
    • 能够操作传入函数的参数。
    • 支持进行数学运算。
    • 可以调用其他pure函数。
  • 不可执行操作

    • 禁止访问状态变量。
    • 不允许调用非viewpure的函数。
  • 示例

contract PureExample {
    // 该函数不依赖任何状态变量,仅对输入参数进行计算
    function add(uint a, uint b) public pure returns (uint) {
        return a + b;
    }
}

3. 关键区别

特性 view 函数 pure 函数
能否读取状态变量 可以 不可以
能否修改状态变量 不可以 不可以
是否消耗 Gas(外部调用时) 不消耗 不消耗
是否消耗 Gas(内部调用时) 消耗 消耗

⚠️ 一般调用这两个关键字都不会消耗gas费, 但是如果是内部调用,例如下面这个例子, store里面调用recive就会导致gas费产生。

function store(uint256 favoriteNumber) public {// 存储
       myFavoriteNumber = favoriteNumber;
       recive(favoriteNumber);
   }

 function recive() public view returns (uint256) {
     return myFavoriteNumber;
 }

完整代码:

// SPDX-License-Identifier: MIT
pragma solidity 0.8.19; // stating our version 

contract SimpleStorage {
    uint256 public myFavoriteNumber; // 初始值就是0 而且是internal 也就是内部不可见的



    // 数组
    uint256[] public myFavoriteNumbers;

    // 结构
    struct Person {
        uint256 personNumber;
        string name;
    }

    Person public newPerson = Person(1, 'jack');

    Person public myPerson;

    Person[] public myPersonArray;

    function setPerson(string memory name, uint256 person_number) public {
        myPerson = Person(person_number, name);
        myPersonArray.push(myPerson);
    }

    function store(uint256 favoriteNumber) public {// 存储
        myFavoriteNumber = favoriteNumber;
    }

    // view 可读不可写 pure 不可读不可写
    function recive() public view returns (uint256) {
        return myFavoriteNumber;
    }



}